﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Colonisator.Classes
{
    /// <summary>
    /// Chaque carte du jeu est instanciée dans cette classe.
    /// </summary>
    public class Carte
    {
        /// <summary>
        /// identification de la carte
        /// </summary>
        public string ID { get; set; }

        /// <summary>
        /// description complète
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        /// type de la carte (enum)
        /// </summary>
        public CardType Type { get; set; }

        /// <summary>
        /// L'ensemble des choix provoqués par cette carte donne une liste de Résolutions
        /// </summary>
        public List<ResolutionCarte> ResolutionsCarte { get; set; }

        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        public Carte()
        {
            ResolutionsCarte = new List<ResolutionCarte>();
        }

        public static void LoadCards()
        {
            var partie = Partie.GetInstance();

            var cards = Directory.GetFiles(Directory.GetCurrentDirectory() + @"\..\Cartes\", "*.card");
            
            foreach (var item in cards)
            {
                try
                {
                    var card = new Carte();
                    using (var sr = new StreamReader(item))
                    {
                        while (!sr.EndOfStream)
                        {
                            var line = sr.ReadLine();
                            var label = line.Split('#')[0];
                            switch (label)
                            {
                                case "ID":
                                    card.ID = line.Split('#')[1];
                                    break;
                                case "Type":
                                    var type = line.Split('#')[1];
                                    card.Type = SetCardType(type);
                                    break;
                                case "Description":
                                    card.Description = line.Split('#')[1].Trim();
                                    break;
                                case "Resolution":
                                    var compo = line.Split('#')[1].Split(';');
                                    var resolution = new ResolutionCarte();
                                    // Pour chaque élément de résolution
                                    for (int i = 0; i < compo.Length; i++)
                                    {                                      
                                        // gestion des tours d'attente
                                        if (compo[i].Contains("ToursAttente"))                                        
                                            resolution.ToursAttente = Convert.ToInt32(compo[i].Split('=')[1]);
                                        // gestion de la table de bord
                                        else if (compo[i].Contains("TableDeBord"))
                                        {
                                            var table = compo[i].Split('{')[1].Split('&');
                                            for (int j = 0; j < table.Length; j++)
                                            {
                                                // en cas de trésor
                                                if (table[j].Split('=')[1].Equals("Tresor"))
                                                    resolution.DeltaTableDeBord.Tresor = new TableDeBord();
                                                else
                                                {
                                                    var property = resolution.DeltaTableDeBord.GetType().GetProperties().Where(x => x.Name.Equals(table[j].Split('=')[0])).First();
                                                    property.SetValue(resolution.DeltaTableDeBord, Convert.ToInt32(table[j].Split('=')[1]), null);
                                                }
                                            }
                                        }
                                        // gestion de la destination
                                        else if (compo[i].Contains("Destination"))
                                        {
                                            var destination = compo[i].Split('=')[1];
                                            resolution.Destination = partie.DonnerIle(destination);
                                        }                                        
                                    }
                                    card.ResolutionsCarte.Add(resolution);
                                    break;
                                default:
                                    break;
                            }
                        }
                        sr.Close();
                    }

                    partie.ListeCartes.Add(card);
                }
                catch
                {
                }
            }

        }

        private static CardType SetCardType(string type)
        {
            switch (type)
            {
                case "Random":
                    return CardType.Random;
                case "Classic":
                    return CardType.Classic;
                case "Attentat":
                    return CardType.Attentat;
                case "Chance":
                    return CardType.Chance;
                case "Agaçante":
                    return CardType.Agaçante;
                case "Taxe":
                    return CardType.Taxe;
                default:
                    return CardType.Unknown;
            }
        }
    }

    public enum CardType
    {
        Random = 0,
        Classic = 1,
        Attentat = 2,
        Chance = 3,
        Agaçante = 4,
        Taxe = 5,
        Unknown = 6
    }
}
